package com.meeting.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/recognition")
public class RecognitionController {

    // 儿童股骨头坏死分期映射数据
    private static final Map<String, AvnStage> STAGE_MAP = new HashMap<>();

    static {
        // 初始化7期症状数据
        STAGE_MAP.put("stage1", new AvnStage(
                "一期",
                "早期阶段",
                "髋关节可能出现隐痛、钝痛，活动后加重，休息后可缓解，疼痛有时会放射至大腿内侧、膝部。髋关节活动范围可能有轻微减小，孩子可能出现轻微跛行。早期下肢缩短可能不明显。",
                new String[]{
                        "减少髋关节负重，避免剧烈活动",
                        "可采用物理治疗缓解疼痛",
                        "定期进行影像学检查监测病情"
                },
                "X线片可能无明显异常，MRI可显示早期骨髓水肿"
        ));

        STAGE_MAP.put("stage2", new AvnStage(
                "二期",
                "进展期",
                "髋部疼痛加重，呈持续性，影响孩子日常活动。髋关节活动受限进一步加剧，跛行症状明显。",
                new String[]{
                        "限制负重活动，必要时使用拐杖",
                        "在医生指导下进行适当的关节活动训练",
                        "考虑药物治疗缓解疼痛和炎症"
                },
                "X线片上可出现囊性变、骨硬化、骨破坏等表现"
        ));

        STAGE_MAP.put("stage3", new AvnStage(
                "三期",
                "股骨头塌陷期",
                "疼痛剧烈，严重影响孩子生活，即使休息时也可能有明显疼痛感。髋关节功能障碍显著，行走困难。",
                new String[]{
                        "严格限制负重，可能需要轮椅辅助",
                        "考虑支具治疗维持股骨头正确位置",
                        "定期复查评估是否需要手术干预"
                },
                "X线片可见股骨头塌陷、变形"
        ));

        STAGE_MAP.put("stage4", new AvnStage(
                "四期",
                "股骨头严重变形期",
                "髋关节疼痛依旧剧烈，负重或活动时疼痛难忍。髋关节活动严重受限，患侧髋关节周围肌肉出现明显萎缩，下肢明显缩短，可能出现髋关节脱位等畸形。",
                new String[]{
                        "根据情况考虑手术治疗",
                        "进行肌肉力量训练，防止进一步萎缩",
                        "疼痛管理和康复治疗相结合"
                },
                "股骨头严重塌陷变形，关节间隙开始变窄"
        ));

        STAGE_MAP.put("stage5", new AvnStage(
                "五期",
                "关节间隙狭窄期",
                "疼痛持续且程度较重。由于髋关节软骨严重磨损、关节间隙狭窄，髋关节活动几乎丧失，只能进行极小范围的活动。下肢短缩更加明显。",
                new String[]{
                        "手术治疗可能是主要选择",
                        "加强康复训练，维持现有关节功能",
                        "心理支持，帮助孩子适应功能障碍"
                },
                "关节间隙明显狭窄，股骨头形态严重异常"
        ));

        STAGE_MAP.put("stage6", new AvnStage(
                "六期",
                "继发性骨关节炎期",
                "疼痛依然较为严重，影响患儿日常生活和睡眠。关节基本失去活动能力，可能只能依靠辅助器具勉强移动。整个患肢肌肉严重萎缩，可能出现骨盆倾斜等继发畸形。",
                new String[]{
                        "评估全髋关节置换的可能性",
                        "积极进行物理治疗，防止关节僵硬",
                        "预防压疮等长期卧床并发症"
                },
                "明显的骨关节炎表现，关节间隙严重狭窄或消失"
        ));

        STAGE_MAP.put("stage7", new AvnStage(
                "七期",
                "终末期",
                "关节完全僵硬，无法活动，髋关节功能丧失，患儿生活不能自理。下肢短缩畸形极为严重，患肢肌肉萎缩殆尽，可能伴有严重的骨质疏松等问题。",
                new String[]{
                        "考虑手术重建或置换",
                        "全面的康复护理计划",
                        "多学科团队协作治疗，包括疼痛管理专家"
                },
                "髋关节完全破坏，严重畸形，骨质增生明显"
        ));
    }

    // 处理图片上传和识别请求
    @PostMapping("/recognize")
    public Map<String, Object> recognizeStage(@RequestParam("image") MultipartFile image) {
        Map<String, Object> result = new HashMap<>();

        try {
            // 检查文件是否为空
            if (image.isEmpty()) {
                result.put("success", false);
                result.put("message", "请上传图片");
                return result;
            }

            // 获取文件名并转换为小写
            String fileName = image.getOriginalFilename().toLowerCase();

            // 根据文件名识别分期
            String stageKey = recognizeStageKey(fileName);

            // 获取分期信息
            AvnStage stage = STAGE_MAP.get(stageKey);

            if (stage != null) {
                // 构建响应数据
                result.put("success", true);
                result.put("stage", stage);
            } else {
                result.put("success", false);
            }

        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "识别过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        }

        return result;
    }

    // 根据文件名识别分期关键词
    private String recognizeStageKey(String fileName) {
        if (fileName.contains("stage1") || fileName.contains("一期") || fileName.contains("1")) {
            return "stage1";
        } else if (fileName.contains("stage2") || fileName.contains("二期") || fileName.contains("2")) {
            return "stage2";
        } else if (fileName.contains("stage3") || fileName.contains("三期") || fileName.contains("3")) {
            return "stage3";
        } else if (fileName.contains("stage4") || fileName.contains("四期") || fileName.contains("4")) {
            return "stage4";
        } else if (fileName.contains("stage5") || fileName.contains("五期") || fileName.contains("5")) {
            return "stage5";
        } else if (fileName.contains("stage6") || fileName.contains("六期") || fileName.contains("6")) {
            return "stage6";
        } else if (fileName.contains("stage7") || fileName.contains("七期") || fileName.contains("7")) {
            return "stage7";
        } else {
            return null;
        }
    }

    // 股骨头坏死分期类
    static class AvnStage {
        private String stageName;
        private String stageTitle;
        private String description;
        private String[] suggestions;
        private String imagingFeatures;

        public AvnStage(String stageName, String stageTitle, String description,
                        String[] suggestions, String imagingFeatures) {
            this.stageName = stageName;
            this.stageTitle = stageTitle;
            this.description = description;
            this.suggestions = suggestions;
            this.imagingFeatures = imagingFeatures;
        }

        // Getters
        public String getStageName() { return stageName; }
        public String getStageTitle() { return stageTitle; }
        public String getDescription() { return description; }
        public String[] getSuggestions() { return suggestions; }
        public String getImagingFeatures() { return imagingFeatures; }
    }
}

